谈谈架构师的职责
很早就想写一篇文章来谈谈架构师的职责了,因为自己做架构设计也有几年了,有得有失,想以此文来谈谈自己对架构师职责的认识。架构师这个话题很大,在这里不打算深入详谈,只是简要的谈谈,想到哪里说到哪里。在谈架构师之前我想谈谈什么是架构,关于架构有很多种专业的定义,我这里就用最好理解的一种定义来介绍架构是什么,架构就是决策。从技术选型,到架构选型,从业务建模到系统建模,无一不是在做着决策。
要成为一个好的架构师,首先要掌握一些基本理论和技能:
面向对象设计的理论。如果连面向对象的基本理论都不知道就开始做设计,那是很糟糕的,为什么要这样设计,这样设计有什么好处,不是凭空瞎想的,都是有理论依据的,如果设计连一点依据都没有,那肯定是拙劣的设计。
设计模式。设计模式是架构师的基本功,设计模式用来解耦组件内对象之间的关系,用好了,后期的开发阶段将很顺利,用不好则会导致过多的复杂性,降低架构质量,甚至导致开发计划延期。设计模式往往和业务联系得很紧密,如果连设计模式都不懂就做设计,那迟早要栽跟头。
UML理论及其工具。这个是做设计最基本的要求了,如果UML理论都不懂,UML视图都不会画,又怎么完成得了设计?曾看到有人用excell画的几个框图就说这是架构,然后吐沫横飞的讲解所谓的架构,其实这种所谓的设计连玩具都称不上。一个完整的设计至少要包含五种UML图,业务流程图、用例图、活动图、组件图、类图。
架构模式。架构设计的时候常常需要参考借鉴一些经典的架构模式,因为这些架构模式就是前人总结的用来解决实际问题的,有非常重要的借鉴意义,可以避免少走很多弯路,尤其是在系统设计的时候,参考一些架构模式常常能事半功倍。
重构。架构也是需要不断重构的,没有完美的架构,只有不断折中、不断切合实际需求的架构,这是一个不断完善的过程,完善的一个重要手段就是重构。
代码质量理论。架构师不仅仅是画几个图而已,架构师需要参与技术攻关和核心模块的开发,并关注开发过程中的代码质量,高质量的代码会让架构的实现锦上添花。
上面说到的这些基本理论和技能也不是一朝一夕就能掌握的,需要一个不断学习、实践和思考的过程,当你某一天掌握了这些基本理论和技能之后,相信你做架构设计的时候自然也是成竹在胸。不过,即使你具备了上面提到的这些理论和技能、技术很不错的情况下,依然不能保证能做出一个成功的设计,因为还有一些要求你需要达到,否则,一样做不出成功的架构,而这些要求并非都是技术上的要求。
架构师除了是一个优秀的技术工程师之外还应该以下下角色:
应该是好的产品工程师
如果以为自己掌握了上面提到那些基本技能,就一定能设计出牛X的架构,那是相当错误的想法,包括我曾经都这么认为。这也是搞技术的人的通病,只对技术感兴趣,认为做出一些牛X的技术就很牛了,就能搞定一切了。其实技术只是手段,关键是要能做出好的产品,而要做出好的产品就需要对产品、对业务很精通,如果对于产品和业务的理解不深入,做出的东西很可能就不是用户想要的,甚至是失败的产品,这种例子现实中太多了,不要认为技术是万能的,要清楚的意识到,技术是服务于产品的。架构师应该是好的产品工程师的另外一个理由是,不懂业务就不能做架构,如果不懂业务,那么设计出来的东西一定是失败的,因为业务流程、业务规则、业务细节等等都是变化点,如果设计之初都不管不顾,甚至不深入挖掘,那么到最后,甚至在快完工之前,一个细小的业务规就是压死骆驼的最后一根稻草了。这个我是吃过亏的,以前做的一个项目,最开始我只是粗略的了解了业务就开始做设计,等到设计开发快完了,发现有一个业务规则没有处理,而这个业务规则导致之前的抽象变得支离破碎,而接着是其它的业务规则又导致原来的设计被破坏,而且还难于修改,几乎陷于泥潭,最终费很大力气修改完成,却发现和自己设计之初的理念相去甚远,连我自己都惊讶我怎么精心设计出这么一个丑陋的东西出来,最后不得不推倒重来。这些教训让我深刻的体会到好的架构师一定要先成为一个优秀的产品工程师。
架构师还应该是一名好的推销员。
是的,你没看错,架构师就应该是一名出色的推销员,当你开始设计的时候,首先你需要向你的领导推销你的设计理念,要向领导描绘出设计蓝图,获得领导的认同很重要,往往一个项目的方向都是领导决定的,领导不认同,项目是没法做下去的。但是这里有一个问题,往往领导都不懂技术,他们可能很精于产品,而对技术不感兴趣,所以架构师要从产品的角度向领导来介绍架构设计,而不能从技术的角度去介绍,这才是你们沟通的基础。
向领导推销完设计之后还需要向产品人员推销你的设计,为什么要向产品人员推销设计呢?这很重要,因为需求很大一部分来自于产品工程师,向产品工程师推销你的设计,目的是让产品工程师了解你的设计细节,及时发现设计的错误,甚至还会发现你没有考虑的问题、细节和需求,越早发现这些问题越有助于后面的设计和开发,避免在后期大改或者推倒重来。向产品工程师推销你的设计的时候同样不要从技术的角度来推销。更多的是从业务的角度来告诉他们,比如我这样设计是为了处理某种复杂的业务,通过这种设计我们能很方便的处理这些复杂的逻辑,还容易扩展。业务才是你和产品工程师的共同语言。
向产品工程师推销完你的设计之后,就应该向项目组的开发人员推销的设计了,这同样很重要,因为架构设计最终是需要他们完成的,架构的实现,最重要的是开发人员,如果开发人员不理解你的设计,甚至有抵触情绪,那么破坏架构的事情经常就会发生,士气低落,不能团结一致,最终会导致项目的失败,所以架构师一定要向开发人员推销设计。开发人员理解并认同设计是项目成功的关键因素之一。如和向开发人员推销设计呢?从纯技术的角度来推销。从面向对象的基本理论开始介绍你为什么要这样设计,这样设计的好处在哪里,而开发人员是如何从中受益等等,我相信有理有据的技术交流是最容易博得开发人员的认同。而且一个优秀的架构必定是一个受开发人员欢迎与支持的架构,只要大家都认同的架构才是好的架构。
怎么样,现在知道架构师为什么还必须是一个好的推销员了吧,只有大家认同了你的设计理念,你才可能设计一个成功的架构。
架构师还应该是好的培训师
开发人员不像产品工程师那样不懂技术,开发人员是懂技术的,都会有自己的想法,如果遇到某个值得商榷的地方时,开发人员会提出自己的见解,这时就需要做折中了,从开发人员的角度去考虑,是否需要修改,如果要修改,则尽量在不改变大的设计原则基础上做小幅改动,让大家达成共识。最终的目标是让开发人员认同设计,并乐于在这个架构上开发,这是非常重要的,也是保证一个架构成功实现的重要因素。如果开发工程师受限自己知识水平,不理解架构设计的思想,这时,架构师就需要做些技术培训了,通过这些技术培训来让开发工程师明白设计的理念,最终认同设计。我一直在强调沟通和认同,因为这真的很重要,kent beck曾提出,程序员的编程价值观是:沟通、简单和灵活。这是非常重要的概念,为什么我们需要编程价值观,因为价值观决定了行为,有什么样的价值观就有什么样的行为,如果程序员认为程序的可理解性、简单性很重要,那么他的代码风格肯定是易读易懂的,而这些恰恰是软件的品质属性,如果大家都认同这些理念,自觉按照这些思想去写代码,软件的质量自然就提高了。相反,如果大家不认同这些理念,都按照自己的想法去做,那么最终得到是一个混乱的混合体,会导致软件项目的失败。只有大家都有一个共同的编程价值观,共同的理念,才可能高质量的完成一个软件项目,因此架构开发的第一步是要达成共识,让大家认同设计。
应该是好的QA和救火队员
项目开发过程中,应该经常审查代码,架构师要确保大家是按照一个方向前进,要确保没有人在破坏架构,破坏架构是很危险的,不仅仅会导致代码慢慢腐化,还会形成破窗效应,危害很大。当开发过程中发现设计考虑不周甚至有问题,要有勇气去重构,而不是缝缝补补,要记住架构的一个重要目的是让开发人员的日子变得美好,如果开发人员用起来都觉得别扭,那这个架构又怎么能成为一个成功的架构呢。开发过程中,如果遇到技术难题,架构师应该充当救火队员的角色,身先士卒主动去解决,因为这是技术调研和技术选型时,考虑不周导致的,身先士卒的去解决技术难题问题还可以让大家对架构更有信心。